// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database();
//requset包
const request = require('request')

function getNewTokenAndRecord() {
  //接口地址：https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
  //返回数据格式: {"access_token": "ACCESS_TOKEN", "expires_in": 7200}

  let appid = 'wx553fbf4a5b9c4d73'; //小程序唯一标识   (在微信小程序管理后台获取)
  let appsecret = '5280cac89916b7810922e63dc70278ac'; //小程序的 app secret (在微信小程序管理后台获取)
  let grant_type = "client_credential"; //授权（必填）
  let url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + appsecret;
  //新建promise对象，发起http统一下单请求
  return new Promise((resolve, reject) => {
    try {
      request.post({
          url: url,
          method: "GET",
        },
        function(error, response, body) {
          if (!error && response.statusCode == 200) {
            let newToken = JSON.parse(body)
            return resolve(newToken)
          } else {
            return reject(err)
          }
        })
    } catch (e) {
      return reject(err)
    }
  })

}
// 云函数入口函数
exports.main = async(event, context) => {
  let token = '';
  //数据库中的token集合 token{}
  let queryToken = await db.collection('token').get();
  if (queryToken.errMsg == 'collection.get:ok') //查询成功
  {
    let record = queryToken.data[0];
    let lastTime = record.timestamp; //上次记录token的时间戳
    let thisTime = Date.parse(new Date()) //当前时间的时间戳
    if ((thisTime - lastTime) > 7000000) //token快过期需要重新获取
    {
      let httpToken = await getNewTokenAndRecord(); //发出http请求获取新的token
      if ('access_token' in httpToken) //
      {
        //(1)成功获取新的token
        //1.1 记录新的token和当前时间
        let update = await db.collection('token').doc('W6ELbe9Ghf6stBXB')
          .update({
            data: {
              access_token: httpToken.access_token,
              timestamp: thisTime
            }
          })
        if (update.errMsg == 'document.update:ok') {
          return httpToken.access_token;
        } else {
          return ''; //如果执行token更新失败，则返回token为空
        }
      }
      else{
          return ''; //如果执行http生成token失败，也返回空
      }
    } else //token尚未过期,可以直接使用
    {
      return record.access_token;
    }
  }
}